package com.common.config;

//import org.apache.ibatis.cache.CacheKey;
//import org.apache.ibatis.executor.Executor;
//import org.apache.ibatis.mapping.BoundSql;
//import org.apache.ibatis.mapping.MappedStatement;
//import org.apache.ibatis.mapping.SqlCommandType;
//import org.apache.ibatis.plugin.Interceptor;
//import org.apache.ibatis.plugin.Intercepts;
//import org.apache.ibatis.plugin.Invocation;
//import org.apache.ibatis.plugin.Signature;
//import org.apache.ibatis.session.ResultHandler;
//import org.apache.ibatis.session.RowBounds;
//import org.springframework.stereotype.Component;
//
//import java.lang.reflect.Field;
//
///**
// * 拦截SQL语句，根据处理好的数据权限条件拼接在原SQL后，组成新的SQL语句
// */
//@Component
//@Intercepts({@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class})})
//public class DataScopeInterceptor implements Interceptor {
//
//    /** 分组 */
//    private static final String GROUP_BY = "GROUP BY";
//    /** 排序 */
//    private static final String ORDER_BY = "ORDER BY";
//    /** 分页 */
//    private static final String LIMIT = "LIMIT";
//    /** where */
//    private static final String WHERE = "WHERE";
//
//    /** where条件 */
//    private static final String WHERE_CONDITION = " WHERE 1=1 ";
//
//    /**
//     * 拦截sql
//     * @param invocation
//     */
//    @Override
//    public Object intercept(Invocation invocation) throws Throwable {
//        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
//        SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
//        if (SqlCommandType.SELECT == sqlCommandType) {
//            // 获取过滤条件
//            Object dataAuthSql = DataScopeAspect.DATA_AUTH_THREAD_LOCAL.get();
//            //如果添加数据权限
//            if (null != dataAuthSql) {
//                BoundSql boundSql = (BoundSql) invocation.getArgs()[5];
//                StringBuilder newSqlBuilder = new StringBuilder();
//                // 获取到原始sql语句
//                String mSql = boundSql.getSql();
//                System.out.println("原始SQL：\t"+mSql);
//                mSql = addWhere(mSql);
//                //重写sql语句 前面拼接数据权限语句
//                if (mSql.indexOf(GROUP_BY) > 0) {
//                    newSqlBuilder.append(mSql.substring(0, mSql.lastIndexOf(GROUP_BY)))
//                            .append(" and ")
//                            .append(dataAuthSql.toString())
//                            .append(" ")
//                            .append(mSql.substring(mSql.lastIndexOf(GROUP_BY), mSql.length()));
//                } else if (mSql.indexOf(ORDER_BY) > 0) {
//                    newSqlBuilder.append(mSql.substring(0, mSql.lastIndexOf(ORDER_BY)))
//                            .append(" and ")
//                            .append(dataAuthSql.toString())
//                            .append(" ")
//                            .append(mSql.substring(mSql.lastIndexOf(ORDER_BY), mSql.length()));
//                } else if (mSql.indexOf(LIMIT) > 0) {
//                    newSqlBuilder.append(mSql.substring(0, mSql.lastIndexOf(LIMIT)))
//                            .append(" and ")
//                            .append(dataAuthSql.toString())
//                            .append(" ")
//                            .append(mSql.substring(mSql.lastIndexOf(LIMIT), mSql.length()));
//                } else if (mSql.indexOf(WHERE) > 0) {
//                    newSqlBuilder.append(mSql)
//                            .append(" and ")
//                            .append(dataAuthSql.toString());
//                } else {
//                    newSqlBuilder.append(mSql)
//                            .append(WHERE_CONDITION)
//                            .append(" and ")
//                            .append(dataAuthSql.toString());
//                }
//                System.out.println("增强后的SQL：\t"+newSqlBuilder.toString());
//                //通过反射修改sql语句
//                Field field = boundSql.getClass().getDeclaredField("sql");
//                field.setAccessible(true);
//                field.set(boundSql, newSqlBuilder.toString());
//            }
//        }
//        return invocation.proceed();
//    }
//
//    /**
//     * 添加where关键字
//     * @param sql sql语句
//     * @return sql
//     */
//    private String addWhere(String sql) {
//        if (sql.indexOf(WHERE) >= 0) {
//            return sql;
//        }
//        StringBuilder newSqlBuilder = new StringBuilder();
//        if (sql.indexOf(GROUP_BY) > 0) {
//            newSqlBuilder.append(sql.substring(0, sql.lastIndexOf(GROUP_BY)))
//                    .append(WHERE_CONDITION)
//                    .append(sql.substring(sql.lastIndexOf(GROUP_BY), sql.length()));
//        } else if (sql.indexOf(ORDER_BY) > 0) {
//            newSqlBuilder.append(sql.substring(0, sql.lastIndexOf(ORDER_BY)))
//                    .append(WHERE_CONDITION)
//                    .append(sql.substring(sql.lastIndexOf(ORDER_BY), sql.length()));
//        } else if (sql.indexOf(LIMIT) > 0) {
//            newSqlBuilder.append(sql.substring(0, sql.lastIndexOf(LIMIT)))
//                    .append(WHERE_CONDITION)
//                    .append(sql.substring(sql.lastIndexOf(LIMIT), sql.length()));
//        } else {
//            newSqlBuilder.append(sql).append(" ").append(WHERE_CONDITION);
//        }
//        return newSqlBuilder.toString();
//    }
//}
